package com.funtl.framework.java.common.util.calculation;

import java.math.BigDecimal;

/**
 * GPS度分秒转换
 * @author wmli
 *
 */
public class ConvertLatlng {
	// 经纬度度分秒转换为小数
	public double convertToDecimal(double du, double fen, double miao) {
		if (du < 0)
			return -(Math.abs(du) + (Math.abs(fen) + (Math.abs(miao) / 60)) / 60);
		return Math.abs(du) + (Math.abs(fen) + (Math.abs(miao) / 60)) / 60;
	}

	// 以字符串形式输入经纬度的转换
	public double convertToDecimalByString(String latlng) {
		double du = 0;
		double fen = 0;
		double miao = 0;
		if (latlng.indexOf("°") != -1) {
			du = Double.parseDouble(latlng.substring(0, latlng.indexOf("°")));
			if (latlng.indexOf("′") != -1) {
				fen = Double.parseDouble(latlng.substring(
						latlng.indexOf("°") + 1, latlng.indexOf("′")));
				if (latlng.indexOf("″") != -1) {
					miao = Double.parseDouble(latlng.substring(
							latlng.indexOf("′") + 1, latlng.indexOf("″")));
				}
			}
		}

		if (du < 0)
			return -(Math.abs(du) + (fen + (miao / 60)) / 60);
		return du + (fen + (miao / 60)) / 60;

	}

	// 将小数转换为度分秒
	public String convertToSexagesimal(double num) {
		int du = (int) Math.floor(Math.abs(num)); // 获取整数部分
		double temp = getdPoint(Math.abs(num)) * 60;
		int fen = (int) Math.floor(temp); // 获取整数部分
		double miao = getdPoint(temp) * 60;
		if (num < 0)
			return "-" + du + "°" + fen + "′" + miao + "″";

		return du + "°" + fen + "′" + miao + "″";

	}

	// 获取小数部分
	public double getdPoint(double num) {
		double d = num;
		int fInt = (int) d;
		BigDecimal b1 = new BigDecimal(Double.toString(d));
		BigDecimal b2 = new BigDecimal(Integer.toString(fInt));
		double dPoint = b1.subtract(b2).floatValue();
		return dPoint;
	}

	public static void main(String[] args) {
		// N 29°35.4426' E103°45.4133'
		ConvertLatlng convert = new ConvertLatlng();
		System.out.println("纬度:"
				+ convert.convertToDecimalByString("22°41.1891′") + ",经度："
				+ convert.convertToDecimalByString("114°19.1153′"));
	}
}
